package org.rslai.autotest.core.page;

import org.openqa.selenium.By;
import org.rslai.autotest.core.page.impl.KeyOperation;

/**
 * Actions处理方法接口
 * @author rslai
 */
public interface Actions {

	/**
	 * 鼠标移动到指定对象
	 * @param by 指定对象
	 */
	public void mouseMove(By by);

	/**
	 * 鼠标移动到指定对象的相对坐标位置
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴偏移量
	 * @param yOffset 指定对象的Y轴偏移量
	 */
	public void mouseMove(By by, int xOffset, int yOffset);

	/**
	 * 鼠标从当前位置移动到相对位置
	 * @param xOffset 鼠标当前位置的x轴偏移量
	 * @param yOffset 鼠标当前位置的y轴偏移量
	 */
	public void mouseMove(int xOffset, int yOffset);

	/**
	 * 鼠标移动到指定对象的上方
	 * @param by 指定对象
	 */
	public void mouseOver(By by);

	/**
	 * 鼠标移出指定对象
	 * @param by 指定对象
	 */
	public void mouseOut(By by);

	/**
	 * 在指定对象上单击鼠标左键
	 * @param by 指定对象
	 */
	public void click(By by);

	/**
	 * 在指定对象的相对位置单击鼠标左键
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴偏移量
	 * @param yOffset 指定对象的Y轴偏移量
	 */
	public void click(By by, int xOffset, int yOffset);

	/**
	 * 在指定对象双击鼠标左键
	 * @param by 指定对象
	 */
	public void doubleClick(By by);

	/**
	 * 在指定对象的相对位置双击鼠标左键
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴偏移量
	 * @param yOffset 指定对象的Y轴偏移量
	 */
	public void doubleClick(By by, int xOffset, int yOffset);

	/**
	 * 在指定对象单击鼠标右键菜单
	 * @param by 指定对象
	 */
	public void contextMenu(By by);

	/**
	 * 在指定对象的相对位置单击鼠标右键菜单
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴偏移量
	 * @param yOffset 指定对象的Y轴偏移量
	 */
	public void contextMenu(By by, int xOffset, int yOffset);

	/**
	 * 单击 enter 键
	 */
	public void enterPress();

	/**
	 * 在指定对象上单击 enter 键
	 * @param by 指定对象
	 */
	public void enterPress(By by);

	/**
	 * 单击 tab 键
	 */
	public void tabPress();

	/**
	 * 在指定对象上单击 tab 键
	 * @param by 指定对象
	 */
	public void tabPress(By by);

	/**
	 * 单击 backspace 键
	 */
	public void backspacePress();

	/**
	 * 在指定对象上单击 backspace 键
	 * @param by 指定对象
	 */
	public void backspacePress(By by);

	/**
	 * 组合键操作 <br>
	 * 例：ctrl+F5 代码如下<br>
	 *		super.actions.ddd(<br>
	 * &nbsp;&nbsp; new KeyOperation(KeyOperation.KEY_DOWN, Keys.CONTROL),<br> 
	 * &nbsp;&nbsp; new KeyOperation(KeyOperation.SENDKEYS, Keys.F5), <br>
	 * &nbsp;&nbsp;new KeyOperation(KeyOperation.KEY_UP, Keys.CONTROL)<br>
	 * &nbsp;&nbsp; );
	 * @param keyOperations 组合键的操作
	 */
	public void keyCombination(KeyOperation ... keyOperations);

	/**
	 * 在指定对象上组合键操作 <br>
	 * 	例：ctrl+F5 代码如下<br>
	 *		super.actions.ddd(<br>
	 *	&nbsp;&nbsp;	new KeyOperation(KeyOperation.KEY_DOWN, Keys.CONTROL),<br> 
	 *	&nbsp;&nbsp;	new KeyOperation(KeyOperation.SENDKEYS, Keys.F5), <br>
	 *	&nbsp;&nbsp;	new KeyOperation(KeyOperation.KEY_UP, Keys.CONTROL)<br>
	 *	&nbsp;&nbsp;	);
	 * @param by 指定对象
	 * @param keyOperations 组合键的操作
	 */
	public void keyCombination(By by, KeyOperation ... keyOperations);

	/**
	 * 拖动指定对象到相对位置（鼠标保持不放开）
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴偏移量
	 * @param yOffset 指定对象的Y轴偏移量
	 */
	public void drag(By by, int xOffset, int yOffset);

	/**
	 * 拖动源对象到目标对象（鼠标保持不放开）<br>
	 * 注意：当被测系统有没松开鼠标对象已移动特效，此方法失效。请使用 drag(By source, By target, int xOffset, int yOffset)
	 * @param source 源对象
	 * @param target 目标对象
	 */
	public void drag(By source, By target);

	/**
	 * 拖动源对象到目标对象的相对位置（鼠标保持不放开）
	 * @param source 源对象
	 * @param target 目标对象
	 * @param xOffset 相对目标对象的X轴坐标偏移
	 * @param yOffset 相对目标对象的Y轴坐标偏移
	 */
	public void drag(By source, By target, int xOffset, int yOffset);

	/**
	 * 拖放指定对象到相对位置（放开鼠标）
	 * @param by 指定对象
	 * @param xOffset 指定对象的X轴坐标偏移
	 * @param yOffset 指定对象的Y轴坐标偏移
	 */
	public void dragAndDrop(By by, int xOffset, int yOffset);

	/**
	 * 拖放源对象到目标对象（放开鼠标）<br>
	 * 注意：当被测系统有没松开鼠标对象已移动特效，此方法失效。请使用 dragAndDrop(By source, By target, int xOffset, int yOffset)
	 * @param source 源对象
	 * @param target 目标对象
	 */
	public void dragAndDrop(By source, By target);

	/**
	 * 拖放源对象到目标对象的相对位置（放开鼠标）
	 * @param source 源对象
	 * @param target 目标对象
	 * @param xOffset 相对目标对象的X轴偏移量
	 * @param yOffset 相对目标对象的Y轴偏移量
	 */
	public void dragAndDrop(By source, By target, int xOffset, int yOffset);

}
